Mongodb insert 插入数据之 重复键 处理
源代码:
var lgInfor={title:””,content:””,time:””,style:””};
然后进行循环调用以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| function(username,callback) { lgInfor.style = "大学"; lgInfor.grade = "大一"; lgInfor.time = new Date(); lgInfor.content = username; this.db.insert(collectionName, lgInfor, function (err, data) { if (err) { console.log(err); return; } else { console.log(username + " 注册成功"); } }); this.db.insert(collectionName, username, callback); };
|
此时调用的时候第一次没什么问题,当第二次调用的时候会出现以下问题:
1 2 3 4 5 6 7
| { [MongoError: E11000 duplicate key error index: test.User.$_id_ dup key: { : ObjectId('5362235c895105241d43c46e') }] name: 'MongoError', err: 'E11000 duplicate key error index: test.User.$_id_ dup key: { : ObjectId(\'5362235c895105241d43c46e\') }', code: 11000, n: 0, connectionId: 1, ok: 1 }
|
这是什么意思呢? 意思就是说 出现了重复了键,可是 对于mongodb来说每次插入一条记录就是新生成一个文档,就会自动生成ObjectId ,应该是唯一的啊,怎么会出现重复的问题呢?
在网上找了一下答案,说什么清空一下当前集合就可以什么的,尝试了一下 然并卵,不知道是什么驱动着我去修改了一下代码,修改后的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| function(username,callback) { var lgInfor={}; lgInfor.style = "大学"; lgInfor.grade = "大一"; lgInfor.time = new Date(); lgInfor.content = username; this.db.insert(collectionName, lgInfor, function (err, data) { if (err) { console.log(err); return; } else { console.log(username + " 注册成功"); } }); this.db.insert(collectionName, username, callback); };
|
仅仅是把在外边定义的变量拿到里边而已,问题就解决了,虽然问题是解决了,但是原理还不是很清楚哎,于是又search了一下,有一姐们(看ID猜测)给出了如是答案(php中):
—>>”把定义$data放到foreach里面,否则mongodb会认为是同一条记录重复插入”<<—
但是具体为什么mongodb会认为是同一条记录重复插入呢,还是不知道哎,哪位大神知道愿指点小弟一番,小弟感激涕零